home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s_tool / loadsave.c < prev    next >
Text File  |  1999-06-11  |  29KB  |  1,411 lines

  1. #include    "JX250.H"
  2. #include    <sys\iocs.h>
  3. #include    <sys\dos.h>
  4. #include    <sys\scsi.h>
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <_tnb.c>
  8.  
  9.     // 1 なら JPEGED も使用
  10. #define    JPEGED_    1
  11.  
  12.  
  13. /*------------------------------------------
  14.  *    APICG Information
  15.  */
  16. struct APICGINFO {
  17.     long    STARTX;
  18.     long    STARTY;
  19.     long    SIZEX;
  20.     long    SIZEY;
  21.     long    COLOR;
  22. };
  23. struct    BMPHED {
  24.     UNchar    f_type[2];    // ファイル識別子 'BM'
  25.     int    f_size;        // ファイルのサイズ
  26.     short    f_reserved1;    // 予備1
  27.     short    f_reserved2;    // 予備2
  28.     int    f_offbits;    // ファイル先頭からイメージデータへのオフセット
  29.     //--
  30.     int    win3_size;    // これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  31.     int    win3_width;    // 横サイズ
  32.     int    win3_height;    // 縦サイズ
  33.     short    win3_planes;    // 使用プレーン数
  34.     short    win3_bitcount;    // 色数 (1:2色,4:16色,8:256色,24:16777216色)
  35.     int    win3_comp;    // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
  36.     int    win3_size_image;// イメージデータのサイズ
  37.     int    win3_xpels_pm;    // X方向のディスプレイ分解能
  38.     int    win3_ypels_pm;    // Y方向のディスプレイ分解能
  39.     int    win3_clr_used;    // 色変換テーブルの大きさ
  40.     int    win3_clr_imp;    // 重要な色の数
  41. };
  42. /* Load from File */
  43. long PICLOAD_( UWORD *, char *, long, long, UBYTE *, long, ULONG );
  44. long APICLOAD( UWORD *, char *, long, long, UBYTE *, long, ULONG, UBYTE * );
  45. long JPGLOAD( UWORD *, char *, long, long, UBYTE *, long, ULONG, long );
  46. /* Save to File */
  47. long PICSAVE_( UWORD *, char *, long, long, long, long, UBYTE *, UBYTE *, long, ULONG );
  48. long APICSAVE( UWORD *, char *, long, long, long, long, UBYTE *, UBYTE *, long, ULONG, UBYTE * );
  49.  
  50. static    int    SavSX,SavSY;
  51. static    int    SavLX,SavLY;
  52.  
  53. /**************************************************
  54.     画像セーブ
  55. ***************************************************/
  56. int    SaveGraphic()
  57. {
  58. int    r,f;
  59. if ( ScanData==0 ){
  60.     Dialog("","画像がありません","",1);
  61.     return(1);
  62. }
  63. if ( Afile[0]==0 ){
  64.     Dialog("","ファイル名を指定して下さい","",1);
  65.     return(1);
  66. }
  67. if ( RecX2<=0 || RecY2<=0 ){
  68.     SavSX=0;
  69.     SavSY=0;
  70.     SavLX=ScanDataX;
  71.     SavLY=ScanDataY;
  72. } else {
  73.     SavSX=RecX1;
  74.     SavSY=RecY1;
  75.     SavLX=(RecX2-RecX1)+1;
  76.     SavLY=(RecY2-RecY1)+1;
  77. }
  78. if ( Dialog("","セーブします","",2)!=0 ){
  79.     return(1);
  80. }
  81. f=NewFileCreate();
  82. if ( f<0 )
  83.     return(f);
  84. Dialog("","","      セーブ中",0);
  85. MsPat(-1);
  86. switch(RecSavMode){
  87. case(1):
  88.     //------- PIC
  89.     r=PICSave(f);
  90.     break;
  91. case(0):
  92.     //------- CUT
  93.     r=CUTSave(f);
  94.     break;
  95. case(3):
  96.     //------- BMP
  97.     r=BMPSave(f,Afile);
  98.     //r=IPXSave(f);
  99.     break;
  100. case(5):
  101.     //------- RGB
  102.     r=RGBSave(f,Afile);
  103.     break;
  104. case(2):
  105.     //------- GLM
  106.     r=GLMSave(f,Afile);
  107.     //r=PIC2Save(f);
  108.     break;
  109. case(4):
  110.     //------- JEPG
  111.     r=JPEGSave(f,Afile);
  112.     break;
  113. }
  114. MsPat(0);
  115. Dialog(0,0,0,-1);
  116. _dos_close(f);
  117. if ( r!=0 )        // エラーなので
  118.     _dos_delete(Afile);
  119. if ( r>0x6800 )
  120.     Dialog(0,(void*)r,0,1);
  121. if ( r<0 ){
  122.     UNchar    buf[32];
  123.     sprintf(buf,"ERR CODE = %d",r);
  124.     Dialog("エラーが発生しました",buf,0,1);
  125. }
  126. if ( r==0 ){
  127.     Dialog(0,"セーブ終了しました",0,1);
  128.     FileSearch(0);
  129.     ViewFiles(-1);
  130.     ViewFiles(ViewFileY);
  131. }
  132. return(r);
  133. }
  134. /**************************************************
  135.     画像ロード
  136. ***************************************************/
  137. int    LoadGraphic()
  138. {
  139. int    r,f;
  140. if ( Afile[0]==0 ){
  141.     Dialog(0,"ファイル名を指定して下さい",0,1);
  142.     return(1);
  143. }
  144. if ( Dialog("","ロードします","",2)!=0 ){
  145.     return(1);
  146. }
  147. if ( DrvAccess(0,Afile)!=0 ){
  148.     Dialog("","ドライブが用意でいていません","ロードを中止します",1);
  149.     return(1);
  150. }
  151. f=_dos_open(Afile,0);
  152. if ( f<0 ){
  153.     Dialog("","ファイルがオープン出来ません","ロードを中止します",1);
  154.     return(1);
  155. }
  156. if ( ScanData>99 ){
  157.     _dos_mfree(ScanData);
  158.     ScanData=0;
  159. }
  160. Dialog("","","     ロード中",0);
  161. MsPat(-1);
  162. r=0;
  163. switch(RecSavMode){
  164. case(1):
  165.     //------- PIC
  166.     r=PICLoad(f);
  167.     break;
  168. case(0):
  169.     //------- CUT
  170.     r=CUTLoad(f);
  171.     break;
  172. case(3):
  173.     //------- BMP
  174.     r=BMPLoad(f);
  175.     //r=IPXLoad(f);
  176.     break;
  177. case(5):
  178.     //------- RGB
  179.     r=RGBLoad(f,Afile);
  180.     break;
  181. case(2):
  182.     //------- GLM
  183.     r=GLMLoad(f);
  184.     //r=PIC2Load(f);
  185.     break;
  186. case(4):
  187.     //------- JEPG
  188.     r=JPEGLoad(f,Afile);
  189.     break;
  190. }
  191. MsPat(0);
  192. Dialog(0,0,0,-1);
  193. _dos_close(f);
  194. if ( r!=0 ){        // エラーなので
  195.     if ( ScanData>99 ){
  196.         _dos_mfree(ScanData);
  197.         ScanData=0;
  198.     }
  199.     ScanGraphView(0,0,0);
  200. }
  201. if ( r>0x6800 )
  202.     Dialog(0,(void*)r,0,1);
  203. if ( r<0 ){
  204.     UNchar    buf[32];
  205.     sprintf(buf,"ERR CODE = %d",r);
  206.     Dialog("エラーが発生しました",buf,0,1);
  207. }
  208. if ( r==0 ){
  209.     MakeGammaTable(DataMd);
  210.     ScanGraphView(0,0,0);
  211.     Dialog(0,"ロード終了しました",0,1);
  212.     VewPX=0;
  213.     VewPY=0;
  214.     RecPX=0;
  215.     RecPY=0;
  216.     RecX1=0;
  217.     RecY1=0;
  218.     RecX2=ScanDataX-1;
  219.     RecY2=ScanDataY-1;
  220.     Rec_PosSetDraw(RecX1,RecY1,RecX2,RecY2);
  221. }
  222. return(r);
  223. }
  224. /*------------------------------------------------------------------*/
  225. /*******************************************
  226.             カットファイル  (OK)
  227.         [.CUT]
  228. [戻り値] 0=正常終了
  229. ********************************************/
  230. int    CUTSave(f)
  231. int    f;
  232. {
  233. #define BUF_X    128
  234. int    x,y,size;
  235. int    spp;
  236. UNshort    w;
  237. UNchar    *G,*M;
  238. UNshort    *P;
  239. short    dx,dy;
  240. UNchar    cond1[256],cond2[256];
  241. UNchar    buf[16000];
  242. G=ScanData;
  243. dx=SavLX;
  244. dy=SavLY;
  245. sprintf( buf, "%-8s(%.4d,%.4d)%-26s\r\n\x1A", "CUT_V1.0", dx, dy, "JX250" );
  246.  __fwrite(f,buf,48);
  247.  w=dx;
  248.  __fwrite(f,&w,2);
  249.  w=dy;
  250.  __fwrite(f,&w,2);
  251.  M=buf;
  252.  y=0;
  253.  size=(((dx-1)>>3)+1);
  254.  condence2(cond1,0,cond2);    ///初期化
  255.  for(;dy;dy--){
  256.     for(x=0;x<SavLX;x+=8)
  257.         M[x/8]=0;
  258.     if ( DataC==0 ){
  259.         //-- 64k
  260.         for(x=0;x<SavLX;x++){
  261.             if ( GG(G[(SavSX+x)*2+(SavSY+y)*DataX*2]*0x100)>16 )
  262.                 M[x/8]|=bit(7-(x&7));
  263.         }
  264.     } else {
  265.         //-- 24bit
  266.         if ( DataMd==5 ){
  267.             // カラー
  268.             for(x=0;x<SavLX;x++){
  269.                 if ( G[(SavSX+x)*3+(SavSY+y)*DataX*3]>128 )
  270.                     M[x/8]|=bit(7-(x&7));
  271.             }
  272.         } else {
  273.             // モノ
  274.             for(x=0;x<SavLX;x++){
  275.                 if ( G[(SavSX+x)+(SavSY+y)*DataX]>128 )
  276.                     M[x/8]|=bit(7-(x&7));
  277.             }
  278.         }
  279.     }
  280.     dx=condence2(M,size,cond2);
  281.     dx=condence1(cond2,dx,cond1);
  282.     __fwrite(f,cond1,dx);
  283.     y++;
  284. }
  285. return(0);
  286. }
  287. /*++++++++++++++++++++++*/
  288. static    int    condence1( org,count,cond )
  289. UNchar    *org;
  290. int    count;
  291. UNchar    *cond;
  292. {
  293. int    pt, bt, flag, hflag=0;
  294. UNchar    *head, *body;
  295. pt=( (count-1)>>3 )+1;
  296. body=( head=cond+1 )+pt;
  297. for(;pt!=0;pt--){
  298.     flag=0;
  299.     for( bt=8;bt!=0;bt--){
  300.         flag<<=1;
  301.         if ( *org ){
  302.             *body++ = *org;
  303.             flag|=1;
  304.         }
  305.         org++;
  306.     }
  307.     *head++=flag;
  308.     hflag|=(flag!=0);
  309. }
  310. if ( hflag )
  311.     *cond=body-cond;
  312.  else    *cond=1;
  313. return( *cond );
  314. }
  315. /*+++++++++++++++*/
  316. static    int    condence2( org,count,cond )
  317. UNchar    *org;
  318. int    count;
  319. UNchar    *cond;
  320. {
  321. static    UNchar    orgBuf[128];
  322. int    c;
  323. UNchar    *buf;
  324. buf=orgBuf;
  325. if ( count==0 ){
  326.     for(c=0;c<BUF_X;c++)
  327.          *buf++=0;
  328. } else {
  329.     for(c=0;c<count;c++){
  330.         *cond++=*org^*buf;
  331.         *buf++=*org++;
  332.     }
  333. }
  334. return( count );
  335. }
  336. /*****************************************
  337.            拡張Image Photoファイル  (OK)
  338.         [.IPX]
  339.     <format>
  340.         .dc.b    xL,xH,yL,yH
  341.         .dcb.b    x*y
  342. [戻り値] 0=正常終了
  343. ******************************************/
  344. int    IPXSave(f)
  345. int    f;
  346. {
  347. int    x,y,yy;
  348. UNshort    w;
  349. UNchar    buf[16000];
  350. w=(SavLX/0x100)|((SavLX*0x100)&0xFF00);
  351. __fwrite(f,&w,2);
  352. w=(SavLY/0x100)|((SavLY*0x100)&0xFF00);
  353. __fwrite(f,&w,2);
  354. for(y=0;y<SavLY;y++){
  355.     if ( DataC==0 ){
  356.         // 64k
  357.         yy=(y+SavSY)*DataX;
  358.         for(x=0;x<SavLX;x++)
  359.             buf[x]=ScanData[(yy+(x+SavSX))*2]&0xF8;
  360.     } else {
  361.         // 24bit
  362.         if ( DataMd==5 ){
  363.             // カラー
  364.             yy=(y+SavSY)*DataX*3;
  365.             for(x=0;x<SavLX;x++)
  366.                 buf[x]=ScanData[yy+(x+SavSX)*3+1];
  367.         } else {
  368.             // モノクロ
  369.             yy=(y+SavSY)*DataX;
  370.             for(x=0;x<SavLX;x++)
  371.                 buf[x]=ScanData[yy+(x+SavSX)];
  372.         }
  373.     }
  374.      __fwrite(f,buf,ScanDataX);
  375. }
  376. return(0);
  377. }
  378. /*********************************
  379.     PIC セーブ    (OK)
  380. *********************************/
  381. int    PICSave(f)
  382. int    f;
  383. {
  384. int    x,y,r,dx;
  385. int    fbuf[1024*2];
  386. UNchar    *N;
  387. UNshort    *M,*W;
  388. _dos_close(f);
  389. if ( DataC==0 ){
  390.     r=PICSAVE_( ScanData,Afile,
  391.         SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,
  392.         "",fbuf,1024*2*4,bit(15)
  393.     );
  394.     return(r);
  395. }
  396. //--- 24bit カラー
  397. W=_dos_malloc( SavLX*SavLY*2 );
  398. if ( W>=0x81000000 ){
  399.     return("メモリが足りません");
  400. }
  401. M=W;
  402. //-- 64k に変換
  403. if ( DataMd==5 ){
  404.     // カラー
  405.     for(y=0;y<SavLY;y++){
  406.         N=&ScanData[ ((SavSX)+(y+SavSY)*DataX)*3 ];
  407.         for(x=0;x<SavLX;x++,N+=3){
  408.             *M++=RGB(N[0]/8,N[1]/8,N[2]/8);
  409.         }
  410.     }
  411. } else {
  412.     for(y=0;y<SavLY;y++){
  413.         N=&ScanData[ ((SavSX)+(y+SavSY)*DataX) ];
  414.         for(x=0;x<SavLX;x++,N++){
  415.             *M++=RGB(N[0]/8,N[0]/8,N[0]/8);
  416.         }
  417.     }
  418. }
  419. dx=DataX;
  420. DataX=SavLX;        // PICSAVE_ のため
  421. r=PICSAVE_( W,Afile,
  422.     0,0,SavLX-1,SavLY-1,
  423.     "",fbuf,1024*2*4,bit(15)
  424. );
  425. DataX=dx;
  426. _dos_mfree(W);
  427. return(r);
  428. }
  429. /*********************************
  430.     PIC2 セーブ
  431. *********************************/
  432. int    PIC2Save(f)
  433. int    f;
  434. {
  435. int    o,r;
  436. UNchar    buf[256];
  437. _dos_close(f);
  438. o=RecVwBai;
  439. RecVwBai=0;
  440. ScanGraphView(0,0,1);
  441. RecVwBai=o;
  442. sprintf(buf,"pic2 -best -s%d,%d,%d,%d %s",SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,Afile);
  443. r=ChildDisp(buf);
  444. return(r);
  445. }
  446. /*********************************
  447.     JPEG セーブ
  448. *********************************/
  449. int    JPEGSave(f)
  450. int    f;
  451. {
  452. int    r,fi;
  453. UNchar    tn[256];
  454. UNchar    *s,buf[256];
  455. _dos_close(f);
  456. if ( DataC==0 && JpegedUseMode==0 ){    // 0;64k の時使用する 1;使用しない
  457.     //64k
  458.     if ( AspMode==0 )
  459.         s="jpeged %s -s%d,%d,%d,%d -VS%d,%d,$%X %s";
  460.     else    s="jpeged -a %s -s%d,%d,%d,%d -VS%d,%d,$%X %s";
  461.     sprintf(buf,s,
  462.             JpegSwc,
  463.             SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,
  464.             DataX,ScanDataY,(int)ScanData,
  465.             Afile
  466.     );
  467.     r=ChildDisp(buf);
  468.     return(r);
  469. }
  470. //24bit
  471. if ( *RGBtemp==0 ){
  472.     if ( _dos_getenv("jxtemp",0,tn)>=0 ){
  473.         ;
  474.     } elif ( _dos_getenv("temp",0,tn)>=0 ){
  475.         ;
  476.     } else {
  477.         struct    _psp *pd = _dos_getpdb();
  478.         jstrcpy(tn,(char *)pd->exe_path);
  479.     }
  480. } else    jstrcpy(tn,RGBtemp);
  481. jstrcat(tn,"$J25????.RGB");
  482. fi=_dos_maketmp(tn,bit(5));
  483. if ( fi<0 )
  484.     return(fi);
  485. r=RGBSave(fi,tn);
  486. if ( r==0 ){
  487.     _dos_close(fi);
  488.     sprintf(buf,"ej %s %s %s",Jpeg24Swc,tn,Afile);
  489.     r=ChildDisp(buf);
  490. }
  491. _dos_close(fi);
  492. _dos_delete(tn);
  493. strmfe(buf,tn,"IPR");
  494. _dos_delete(buf);
  495. return(r);
  496. }
  497. /*********************************
  498.     RGB セーブ
  499. *********************************/
  500. int    RGBSave(f,fn)
  501. int    f;
  502. UNchar    *fn;
  503. {
  504. int    i,fi,x,y;
  505. UNchar    buf[4096*3];
  506. if ( DataC!=0 ){
  507.     // 24bit
  508.     if ( DataMd==5 ){
  509.         // カラー
  510.         for(y=0;y<SavLY;y++){
  511.             __fwrite(f,&ScanData[(SavSX)*3+(y+SavSY)*DataX*3],SavLX*3);
  512.         }
  513.     } else {
  514.         // モノ
  515.         for(y=0;y<SavLY;y++){
  516.             for(x=0;x<SavLX;x++){
  517.                 i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
  518.                 buf[x*3+0]=i;
  519.                 buf[x*3+1]=i;
  520.                 buf[x*3+2]=i;
  521.             }
  522.             __fwrite(f,buf,SavLX*3);
  523.         }
  524.     }
  525. } else {
  526.     // 64k
  527.     for(y=0;y<SavLY;y++){
  528.         for(x=0;x<SavLX;x++){
  529.             i=*(UNshort*)&ScanData[(x+SavSX)*2+(y+SavSY)*DataX*2];
  530.             buf[x*3+0]=RR(i)*8;
  531.             buf[x*3+1]=GG(i)*8;
  532.             buf[x*3+2]=BB(i)*8;
  533.         }
  534.         __fwrite(f,buf,SavLX*3);
  535.     }
  536. }
  537. strmfe(buf,fn,"IPR");
  538. if ( DrvAccess(1,buf)!=0 ){
  539.     return("プロテクトされています");
  540. }
  541. fi=_dos_create(buf,bit(5));
  542. if ( fi<0 )
  543.     return(fi);
  544. sprintf(buf,"%d %d 0 0\x1A",SavLX,SavLY);
  545. __fwrite(fi,buf,strlen(buf));
  546. _dos_close(fi);
  547. return(0);
  548. }
  549. /*********************************
  550.     BMP セーブ
  551. *********************************/
  552. int    BMPSave(f,fn)
  553. int    f;
  554. UNchar    *fn;
  555. {
  556. int    i,fi,x,y,xx,yy,lx;
  557. UNchar    *C;
  558. UNchar    buf[4096*3];
  559. struct    BMPHED    bmphed;
  560. //-- HED 制作
  561. lx=(SavLX*3+3)&0xFFFC;
  562. bmphed.f_type[0] = 'B';
  563. bmphed.f_type[1] = 'M';
  564. bmphed.f_size = l_mtoi(SavLY*lx+54);        // ファイルのサイズ
  565. bmphed.f_reserved1=0;                // 予備1
  566. bmphed.f_reserved2=0;                // 予備2
  567. bmphed.f_offbits= l_mtoi( 54 );            // ファイル先頭からイメージデータへのオフセット
  568. bmphed.win3_size= l_mtoi( 40 );            // ヘッダサイズ(12:OS/2 V1, 40:Win3, 64:OS/2 V2)
  569. //
  570. bmphed.win3_width= l_mtoi(SavLX);        // 横サイズ
  571. bmphed.win3_height= l_mtoi(SavLY);        // 縦サイズ
  572. bmphed.win3_planes= w_mtoi( 1 );        // 使用プレーン数
  573. bmphed.win3_bitcount= w_mtoi( 24 );        // ビット数
  574. bmphed.win3_comp= l_mtoi( 0 );            // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
  575. //
  576. bmphed.win3_size_image= l_mtoi(SavLY*lx);    // イメージデータのサイズ
  577. bmphed.win3_xpels_pm = l_mtoi( 0xB13 );        //X方向のディスプレイ分解能
  578. bmphed.win3_ypels_pm = l_mtoi( 0xB13 );        //Y方向のディスプレイ分解能
  579. bmphed.win3_clr_used = 0;            // 色変換テーブルの大きさ
  580. bmphed.win3_clr_imp = 0;            // 重要な色の数
  581. //
  582. __fwrite(f,&bmphed,54);
  583. if ( DataC!=0 ){
  584.     // 24bit
  585.     if ( DataMd==5 ){
  586.         // カラー
  587.         //for(y=0;y<SavLY;y++){
  588.         for(y=SavLY-1;y>=0;y--){
  589.             for(x=0;x<SavLX;x++){
  590.                 C=&ScanData[((x+SavSX)+(y+SavSY)*DataX)*3];
  591.                 buf[x*3+0]=C[2];
  592.                 buf[x*3+1]=C[1];
  593.                 buf[x*3+2]=C[0];
  594.             }
  595.             __fwrite(f,buf,lx);
  596.         }
  597.     } else {
  598.         // モノ
  599.         //for(y=0;y<SavLY;y++){
  600.         for(y=SavLY-1;y>=0;y--){
  601.             for(x=0;x<SavLX;x++){
  602.                 i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
  603.                 buf[x*3+0]=i;
  604.                 buf[x*3+1]=i;
  605.                 buf[x*3+2]=i;
  606.             }
  607.             __fwrite(f,buf,lx);
  608.         }
  609.     }
  610. } else {
  611.     // 64k
  612.     //for(y=0;y<SavLY;y++){
  613.     for(y=SavLY-1;y>=0;y--){
  614.         for(x=0;x<SavLX;x++){
  615.             i=*(UNshort*)&ScanData[(x+SavSX)*2+(y+SavSY)*DataX*2];
  616.             buf[x*3+0]=BB(i)*8;
  617.             buf[x*3+1]=GG(i)*8;
  618.             buf[x*3+2]=RR(i)*8;
  619.         }
  620.         __fwrite(f,buf,lx);
  621.     }
  622. }
  623. return(0);
  624. }
  625. /*********************************
  626.     GLM セーブ
  627. *********************************/
  628. int    GLMSave(f,fn)
  629. int    f;
  630. UNchar    *fn;
  631. {
  632. int    i,r,g,b,x,y;
  633. UNchar    buf[4096*3];
  634. static    UNchar    hed[]={
  635.         0x47,0x52,0x36,0x35,
  636.         0x00,0x00,0x00,0x00,
  637.         0x00,0x00,0x00,0x00,
  638.         0x02,0x00,0x02,0x00
  639. };
  640. i=SavLX*SavLY*2 +8;
  641. *(int*)&hed[4]=i;
  642. hed[12]=SavLX/0x100;
  643. hed[13]=SavLX&0xFF;
  644. hed[14]=SavLY/0x100;
  645. hed[15]=SavLY&0xFF;
  646. __fwrite(f,hed,16);
  647. if ( DataC!=0 ){
  648.     // 24bit
  649.     if ( DataMd==5 ){
  650.         // カラー
  651.         for(y=0;y<SavLY;y++){
  652.             for(x=0;x<SavLX;x++){
  653.                 r=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3];
  654.                 g=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3+1];
  655.                 b=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3+2];
  656.                 i=RGB(r/8,g/8,b/8);
  657.                 buf[x*2+0]=i/0x100;
  658.                 buf[x*2+1]=i&0xFF;
  659.             }
  660.             __fwrite(f,buf,SavLX*2);
  661.         }
  662.     } else {
  663.         // モノ
  664.         for(y=0;y<SavLY;y++){
  665.             for(x=0;x<SavLX;x++){
  666.                 i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
  667.                 i/=8;
  668.                 i=RGB(i,i,i);
  669.                 buf[x*2+0]=i/0x100;
  670.                 buf[x*2+1]=i&0xFF;
  671.             }
  672.             __fwrite(f,buf,SavLX*2);
  673.         }
  674.     }
  675. } else {
  676.     // 64k
  677.     for(y=0;y<SavLY;y++)
  678.         __fwrite(f,&ScanData[(SavSX)*2+(y+SavSY)*DataX*2],SavLX*2);
  679. }
  680. return(0);
  681. }
  682. /*------------------------------------------------------------------*/
  683. /**************************************
  684.     CUT ロード
  685. **************************************/
  686. char    *CUTLoad(f)
  687. int    f;
  688. {
  689. int    i,x,y,dx,dy,x_,xx,yy;
  690. int    size;
  691. short    w;
  692. UNchar    cond1[256],cond2[256];
  693. UNchar    buf[256];
  694. UNchar    *M;
  695. __fread(f,buf,48);
  696. if( strncmp(buf,"CUT_V",5)!=0 )
  697.     return("CUT FILEではありません");
  698. __fread(f,&w,2);
  699. xx=dx=w;
  700. __fread(f,&w,2);
  701. yy=dy=w;
  702. x_=(dx+7)&0xFFF8;
  703. if ( x_<512 )
  704.     x_=512;
  705. if ( mat_vadds==0 ){
  706.     if ( FullColor==0 )
  707.         M=_dos_malloc(x_*yy*2);
  708.     elif ( ImageMode==0 )            // 0;カラー 1;白黒
  709.         M=_dos_malloc(x_*yy*3);
  710.     else    M=_dos_malloc(x_*yy);
  711.     if ( M>=0x81000000 ){
  712.         return("メモリが足りませんでした");
  713.         //return(-1);
  714.     }
  715. } else {
  716.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  717.         return("仮想画面SIZE OVER です。");
  718.     }
  719.     M=mat_vadds;
  720.     x_ = mat_xwidth;
  721.     FullColor=0;
  722. }
  723. ScanData=M;
  724. expand2( buf, 0, cond2 );
  725. size = ((dx-1)>>3)+1;
  726. y = 0;
  727. for(;dy;dy--){
  728.     __fread(f,cond1,1);
  729.     __fread(f,cond1+1,*cond1-1);
  730.     expand1( cond2,size,cond1 );
  731.     expand2( buf,size,cond2 );
  732.     for(x=0;x<dx;x++){
  733.         i=(buf[(x/8)]&bit(7-(x&7)))?65535:0;
  734.         if ( FullColor==0 ){
  735.             *(UNshort*)&M[(x+y*x_)*2]=i;
  736.         } elif ( ImageMode==0 ){            // 0;カラー 1;白黒
  737.             M[(x+y*x_)*3+0]=i;
  738.             M[(x+y*x_)*3+1]=i;    // 255 になるから問題無し
  739.             M[(x+y*x_)*3+2]=i;
  740.         } else {
  741.             M[(x+y*x_)]=i;
  742.         }
  743.     }
  744.     y++;
  745. }
  746. ScanDataX=xx;
  747. ScanDataY=yy;
  748. DataX=x_;
  749. if ( FullColor!=0 ){
  750.     if ( ImageMode==0 )
  751.         DataMd=5;
  752.     else    DataMd=2;
  753. }
  754. DataC=FullColor;
  755. return(0);
  756. }
  757. /*+++++++++++++++*/
  758. static    void    expand1( org,count,cond )
  759. UNchar    *org;
  760. int    count;
  761. UNchar    *cond;
  762. {
  763. int    pt, bt, flag;
  764. UNchar    *head, *body;
  765. if ( *cond==1 ) {
  766.     for(pt=0;pt<count;pt++ )
  767.          *org++=0;
  768.     return;
  769. }
  770. pt = ( (count-1)>>3 )+1;
  771. body = (head=cond+1)+pt;
  772. for(;pt;pt--){
  773.     flag = *head++;
  774.     for(bt=8;bt;bt--){
  775.         if ( flag&0x80 )
  776.             *org=*body++;
  777.          else    *org=0;
  778.         org++;
  779.         flag<<=1;
  780.     }
  781. }
  782. }
  783. /*++++++++++++++++++++++++++++*/
  784. static    void    expand2( org,count,cond )
  785. UNchar    *org;
  786. int    count;
  787. UNchar    *cond;
  788. {
  789. static    UNchar    orgBuf[256];
  790. int    c;
  791. UNchar    *buf;
  792. buf = orgBuf;
  793. if ( count==0 ){
  794.     for(c=0;c<BUF_X;c++)
  795.         *buf++ = 0;
  796. } else {
  797.     for(c=0;c<count;c++) {
  798.         *org = *cond++ ^ *buf;
  799.         *buf++ = *org++;
  800.     }
  801. }
  802. }
  803. /*********************************
  804.     IPX ロード
  805. *********************************/
  806. char    *IPXLoad(f)
  807. int    f;
  808. {
  809. int    i,x,xx,y,yy,x_;
  810. UNshort    w;
  811. UNchar    *M;
  812. UNchar    buf[16000];
  813. __fread(f,&w,2);
  814. ScanDataX=(w/0x100)|((w*0x100)&0xFF00);
  815. __fread(f,&w,2);
  816. ScanDataY=(w/0x100)|((w*0x100)&0xFF00);
  817. x_=(xx+7)&0xFFF8;
  818. if ( x_<512 )
  819.     x_=512;
  820. if ( mat_vadds==0 ){
  821.     if ( FullColor==0 )
  822.         M=_dos_malloc(x_*ScanDataY*2);
  823.     elif ( ImageMode==0 )            // 0;カラー 1;白黒
  824.         M=_dos_malloc(x_*ScanDataY*3);
  825.     else    M=_dos_malloc(x_*ScanDataY);
  826.     if ( M>=0x81000000 ){
  827.         return("メモリが足りませんでした");
  828.     }
  829. } else {
  830.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  831.         return("仮想画面SIZE OVER です。");
  832.     }
  833.     M=mat_vadds;
  834.     x_ = mat_xwidth;
  835.     FullColor=0;
  836. }
  837. ScanData=M;
  838. for(y=0;y<ScanDataY;y++){
  839.     __fread(f,buf,ScanDataX);
  840.     if ( FullColor==0 ){
  841.         // 64k
  842.         yy=(y)*x_*2;
  843.         for(x=0;x<ScanDataX;x++){
  844.             i=buf[x]/8;
  845.             *(UNshort*)&ScanData[yy+x*2]=RGB(i,i,i);
  846.         }
  847.     } else {
  848.         // 24bit
  849.         if ( ImageMode==0 ){
  850.             // カラー
  851.             yy=(y)*x_*3;
  852.             for(x=0;x<ScanDataX;x++){
  853.                 i=buf[x];
  854.                 ScanData[yy+x*3+0]=i;
  855.                 ScanData[yy+x*3+1]=i;
  856.                 ScanData[yy+x*3+2]=i;
  857.             }
  858.         } else {
  859.             // モノクロ
  860.             yy=(y)*x_;
  861.             for(x=0;x<ScanDataX;x++){
  862.                 ScanData[yy+x]=buf[x];
  863.             }
  864.         }
  865.     }
  866. }
  867. if ( FullColor!=0 ){
  868.     if ( ImageMode==0 )
  869.         DataMd=5;
  870.     else    DataMd=2;
  871. }
  872. DataC=FullColor;
  873. DataX=x_;
  874. return(0);
  875. }
  876. /*********************************
  877.     PIC ロード
  878. *********************************/
  879. int    PICLoad(f)
  880. int    f;
  881. {
  882. int    xx,yy,x_,r;
  883. int    fbuf[1024*2];
  884. UNchar    *M;
  885. _dos_close(f);
  886. // 大きさを得る
  887. r=PICLOAD_( fbuf,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(1)|bit(2)|bit(3)|bit(4)|bit(15)|bit(31) );
  888. if ( r!=0 )
  889.     return(r);
  890. xx=fbuf[2];
  891. yy=fbuf[3];
  892.                     //printf("pic サイズ=%d,%d",xx,yy);
  893. x_=(xx+7)&0xFFF8;
  894. if ( x_<512 )
  895.     x_=512;
  896. if ( mat_vadds==0 ){
  897.     M=_dos_malloc(x_*yy*2);
  898.     if ( M>=0x81000000 ){
  899.         return("メモリが足りませんでした");
  900.         //return(-1);
  901.     }
  902. } else {
  903.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  904.         return("仮想画面SIZE OVER です。");
  905.     }
  906.     M=mat_vadds;
  907.     x_ = mat_xwidth;
  908. }
  909. ScanData=M;
  910. DataX=x_;
  911. r=PICLOAD_( M,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(2)|bit(3)|bit(4)|bit(15) );
  912. if ( r!=0 )
  913.     return(r);
  914. ScanDataX=xx;
  915. ScanDataY=yy;
  916. FullColor=0;
  917. DataC=0;
  918. return(0);
  919. }
  920. /*********************************
  921.     PIC2 ロード
  922. *********************************/
  923. int    PIC2Load(f)
  924. int    f;
  925. {
  926. int    i,o,r,ssp;
  927. UNchar    buf[256];
  928. UNshort    *M,*N;
  929. _dos_close(f);
  930. if ( mat_vadds==0 ){
  931.     M=_dos_malloc(512*512*2);
  932.     if ( M>=0x81000000 ){
  933.         return("メモリが足りませんでした");
  934.         //return(-1);
  935.     }
  936. } else {
  937.     Dialog("マチエールの仮想画面","では pic2 ロード出来ません","",1);
  938.     return(-1);
  939. }
  940. ScanData=M;
  941. sprintf(buf,"pic2 %s",Afile);
  942.                     //printf("child = %s ",buf);
  943. o=_iocs_b_wpeek(0xE82600);
  944. _iocs_b_wpoke(0xE82600,0x193F);
  945. _iocs_tgusemd(0,0);
  946. _iocs_tgusemd(1,1);
  947. _iocs_g_clr_on();
  948.  
  949. cls();
  950. printf("\n\n\n");
  951. _iocs_tpalet(3,RGB(31,31,31));
  952. r=CHILD(buf);
  953.                     //printf("(r=%d",r);
  954. _iocs_tgusemd(0,2);
  955. _iocs_tgusemd(1,2);
  956. if ( r<0 )
  957.     return(r);
  958. ssp=_iocs_b_super(0);
  959. N=0xC00000;
  960. for(i=0;i<512*512;i++)
  961.     *M++=*N++;
  962. if ( ssp>0 )
  963.     _iocs_b_super(ssp);
  964. _iocs_b_wpoke(0xE82600,o);
  965. ScanDataX=512;
  966. ScanDataY=512;
  967. DataX=512;
  968. FullColor=0;
  969. DataC=0;
  970.  
  971. _iocs_tpalet(0,0);
  972. for(i=1;i<4;i++)
  973.     _iocs_tpalet(i,RGB(i*10+1,i*10+1,i*10+1) );
  974. _iocs_tpalet(4,RGB(15,15,15));
  975. _iocs_tpalet(8,RGB(31,31,31));
  976. _dos_c_curoff();
  977.  
  978. RecodeModeDraw();
  979. return(0);
  980. }
  981. /*********************************
  982.     RGB ロード
  983. *********************************/
  984. int    RGBLoad(f,fn)
  985. int    f;
  986. UNchar    *fn;
  987. {
  988. int    i,j,fi,x,y,xx,yy,x_,ii,d;
  989. UNchar    buf[4096*3];
  990. UNchar    dummy[256];
  991. UNchar    *M;
  992. ii=0;
  993. strmfe(buf,fn,"IPR");
  994. if ( DrvAccess(0,buf)!=0 ){
  995.     return("ドライブが用意でいていません");
  996. }
  997. fi=_dos_open(buf,0);
  998. if ( fi>=0 ){
  999.     i=_dos_read(fi,buf,64);
  1000.     if ( i>=0 ){
  1001.         _dos_close(fi);
  1002.         if ( sscanf(buf,"%d %d 0 0",&xx,&yy)==2 )
  1003.             ii=-1;
  1004.     }
  1005. }
  1006. if ( ii==0 ){
  1007.     strmfe(buf,fn,"FAL");
  1008.     if ( DrvAccess(0,buf)!=0 ){
  1009.         return("ドライブが用意でいていません");
  1010.     }
  1011.     fi=_dos_open(buf,0);
  1012.     if ( fi<0 )
  1013.         return(fi);
  1014.     i=_dos_read(fi,buf,64);
  1015.     if ( i<0 )
  1016.         return(i);
  1017.     _dos_close(fi);
  1018.     if ( sscanf(buf,"%s\n %d %d 0 0",dummy,&xx,&yy)==3 )
  1019.         ii=-1;
  1020. }
  1021. if ( ii==0 ){
  1022.     return("RGB ファイル じゃないようです");
  1023. }
  1024. x_=(xx+7)&0xFFF8;
  1025. if ( x_<512 )
  1026.     x_=512;
  1027. if ( mat_vadds==0 ){
  1028.     if ( FullColor!=0 ){
  1029.         if ( ImageMode==0 )
  1030.             M=_dos_malloc(x_*yy*3);
  1031.         else    M=_dos_malloc(x_*yy);
  1032.     } else {
  1033.         M=_dos_malloc(x_*yy*2);
  1034.     }
  1035.     if ( M>=0x81000000 ){
  1036.         return("メモリが足りませんでした");
  1037.         //return(-1);
  1038.     }
  1039. } else {
  1040.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  1041.         return("仮想画面SIZE OVER です。");
  1042.     }
  1043.     M=mat_vadds;
  1044.     x_ = mat_xwidth;
  1045.     FullColor=0;
  1046. }
  1047. ScanData=M;
  1048. if ( FullColor!=0 ){
  1049.     // 24bit
  1050.     if ( ImageMode==0 ){
  1051.         // カラー
  1052.         for(y=0;y<yy;y++){
  1053.             __fread(f,&ScanData[(y)*x_*3],xx*3);
  1054.         }
  1055.         DataMd=5;
  1056.     } else {
  1057.         // モノ
  1058.         for(y=0;y<yy;y++){
  1059.             __fread(f,buf,xx*3);
  1060.             for(x=0;x<xx;x++){
  1061.                 ScanData[(x)+(y)*x_]=buf[x*3+1];
  1062.             }
  1063.         }
  1064.         DataMd=2;
  1065.     }
  1066. } else {
  1067.     // 64k
  1068.     extern    UNshort    RG0[256],RG1[256];
  1069.     extern    UNshort    GG0[256],GG1[256];
  1070.     extern    UNshort    BG0[256],BG1[256];
  1071.     MakeGammaTable(0);
  1072.     for(y=0;y<yy;y++){
  1073.         __fread(f,buf,xx*3);
  1074.         j=y&1;
  1075.         for(x=0;x<xx;x++,j^=1){
  1076.             if ( j==0 )
  1077.                 d=RG0[buf[x*3+0]]+GG0[buf[x*3+1]]+BG0[buf[x*3+2]];
  1078.             else    d=RG1[buf[x*3+0]]+GG1[buf[x*3+1]]+BG1[buf[x*3+2]];
  1079.             *(UNshort*)&ScanData[(x)*2+(y)*x_*2]=d;
  1080.         }
  1081.     }
  1082. }
  1083. ScanDataX=xx;
  1084. ScanDataY=yy;
  1085. DataX=x_;
  1086. DataC=FullColor;
  1087. return(0);
  1088. }
  1089. /*********************************
  1090.     BMP ロード
  1091. *********************************/
  1092. int    BMPLoad(f,fn)
  1093. int    f;
  1094. UNchar    *fn;
  1095. {
  1096. int    i,j,fi,x,y,xx,yy,x_,ii,d,l,ll,xxx;
  1097. UNchar    buf[4096*3];
  1098. UNchar    dummy[256];
  1099. UNchar    *M;
  1100. struct    BMPHED    bmphed;
  1101. //---- HED 解析
  1102. __fread(f,&bmphed,54);
  1103. if ( bmphed.f_type[0]!='B' || bmphed.f_type[1]!='M' ){
  1104.     return("BMP ファイルではないようです");
  1105. }
  1106. ll=l_mtoi( bmphed.f_offbits );        // ファイル先頭からイメージデータへのオフセット
  1107. /*
  1108.     int    f_offbits;    // ファイル先頭からイメージデータへのオフセット
  1109.  
  1110.     UNchar    f_type[2];    // ファイル識別子 'BM'
  1111.     int    f_size;        // ファイルのサイズ
  1112.     short    f_reserved1;    // 予備1
  1113.     short    f_reserved2;    // 予備2
  1114.     int    f_offbits;    // ファイル先頭からイメージデータへのオフセット
  1115.     //--
  1116.     int    win3_size;    // これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  1117.     int    win3_width;    // 横サイズ
  1118.     int    win3_height;    // 縦サイズ
  1119.     short    win3_planes;    // 使用プレーン数
  1120.     short    win3_bitcount;    // 色数 (1:2色,4:16色,8:256色,24:16777216色)
  1121.     int    win3_comp;    // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
  1122.     int    win3_size_image;// イメージデータのサイズ
  1123.     int    win3_xpels_pm;    // X方向のディスプレイ分解能
  1124.     int    win3_ypels_pm;    // Y方向のディスプレイ分解能
  1125.     int    win3_clr_used;    // 色変換テーブルの大きさ
  1126.     int    win3_clr_imp;    // 重要な色の数
  1127. */
  1128. xx=l_mtoi( bmphed.win3_width );        // 横サイズ
  1129. yy=l_mtoi( bmphed.win3_height );    // 縦サイズ
  1130. xxx=(xx*3+3)&0xFFFC;            // データ上の幅サイズ
  1131. i=w_mtoi( bmphed.win3_bitcount );
  1132. if ( i!=24 && i!=8 ){
  1133.         // 色数 (1:2色,4:16色,8:256色,24:16777216色)
  1134.     return("カラービット数が対応外です");
  1135. }
  1136. /*
  1137.         とりあえず、24bit のみ対応
  1138. */
  1139. if ( i!=24 ){
  1140.         // 色数 (1:2色,4:16色,8:256色,24:16777216色)
  1141.     return("カラービット数が対応外です");
  1142. }
  1143. //--
  1144. x_=(xx+7)&0xFFF8;
  1145. if ( x_<512 )
  1146.     x_=512;
  1147. if ( mat_vadds==0 ){
  1148.     if ( FullColor!=0 ){
  1149.         if ( ImageMode==0 )
  1150.             M=_dos_malloc(x_*yy*3);
  1151.         else    M=_dos_malloc(x_*yy);
  1152.     } else {
  1153.         M=_dos_malloc(x_*yy*2);
  1154.     }
  1155.     if ( M>=0x81000000 ){
  1156.         return("メモリが足りませんでした");
  1157.         //return(-1);
  1158.     }
  1159. } else {
  1160.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  1161.         return("仮想画面SIZE OVER です。");
  1162.     }
  1163.     M=mat_vadds;
  1164.     x_ = mat_xwidth;
  1165.     FullColor=0;
  1166. }
  1167. ScanData=M;
  1168. if ( FullColor!=0 ){
  1169.     // 24bit
  1170.     if ( ImageMode==0 ){
  1171.         // カラー
  1172.         //for(y=0;y<yy;y++){
  1173.         for(y=yy-1;y>=0;y--){
  1174.             __fread(f,buf,xxx);
  1175.             for(x=0;x<xx;x++){
  1176.                 ScanData[((x)+(y)*x_)*3+0]=buf[x*3+2];
  1177.                 ScanData[((x)+(y)*x_)*3+1]=buf[x*3+1];
  1178.                 ScanData[((x)+(y)*x_)*3+2]=buf[x*3+0];
  1179.             }
  1180.         }
  1181.         DataMd=5;
  1182.     } else {
  1183.         // モノ
  1184.         //for(y=0;y<yy;y++){
  1185.         for(y=yy-1;y>=0;y--){
  1186.             __fread(f,buf,xxx);
  1187.             for(x=0;x<xx;x++){
  1188.                 ScanData[(x)+(y)*x_]=buf[x*3+1];
  1189.             }
  1190.         }
  1191.         DataMd=2;
  1192.     }
  1193. } else {
  1194.     // 64k
  1195.     extern    UNshort    RG0[256],RG1[256];
  1196.     extern    UNshort    GG0[256],GG1[256];
  1197.     extern    UNshort    BG0[256],BG1[256];
  1198.     MakeGammaTable(0);
  1199.     //for(y=0;y<yy;y++){
  1200.     for(y=yy-1;y>=0;y--){
  1201.         __fread(f,buf,xxx);
  1202.         j=y&1;
  1203.         for(x=0;x<xx;x++,j^=1){
  1204.             if ( j==0 )
  1205.                 d=RG0[buf[x*3+2]]+GG0[buf[x*3+1]]+BG0[buf[x*3+0]];
  1206.             else    d=RG1[buf[x*3+2]]+GG1[buf[x*3+1]]+BG1[buf[x*3+0]];
  1207.             *(UNshort*)&ScanData[(x)*2+(y)*x_*2]=d;
  1208.         }
  1209.     }
  1210. }
  1211. ScanDataX=xx;
  1212. ScanDataY=yy;
  1213. DataX=x_;
  1214. DataC=FullColor;
  1215. return(0);
  1216. }
  1217. /*********************************
  1218.     JPEG ロード
  1219. *********************************/
  1220. int    JPEGLoad(f)
  1221. int    f;
  1222. {
  1223. int    i,r,fi,xx,yy,x_,y_;
  1224. UNchar    tn[256];
  1225. UNchar    buf[256];
  1226. int    fbuf[1024*2];
  1227. UNchar    *M;
  1228. UNshort    *N;
  1229. _dos_close(f);
  1230. if ( mat_vadds!=0 )
  1231.     FullColor=0;
  1232. if ( FullColor==0 && JpegedUseMode==0 ){    // 0;64k の時使用する 1;使用しない
  1233.     //64k
  1234.     // 大きさを得る
  1235.     r=JPGLOAD( fbuf,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(1)|bit(2)|bit(3)|bit(4)|bit(15)|bit(31),100 );
  1236.     if ( r!=0 )
  1237.         return(r);
  1238.     xx=fbuf[2];
  1239.     yy=fbuf[3];
  1240.                         //printf("pic サイズ=%d,%d",xx,yy);
  1241.     x_=xx;
  1242.     y_=yy;
  1243.     if ( mat_vadds==0 ){
  1244.         M=_dos_malloc(x_*yy*2);
  1245.         if ( M>=0x81000000 ){
  1246.             return("メモリが足りませんでした");
  1247.             //return(-1);
  1248.         }
  1249.     } else {
  1250.         if ( xx>mat_xwidth || yy>mat_ywidth ){
  1251.             return("仮想画面SIZE OVER です。");
  1252.         }
  1253.         M=mat_vadds;
  1254.         x_ = mat_xwidth;
  1255.         y_ = mat_ywidth;
  1256.     }
  1257.     ScanData=M;
  1258.     sprintf(buf,"jpeged -L0,0 -VS%d,%d,$%X %s",
  1259.         x_,y_,M,
  1260.         Afile
  1261.     );
  1262.     r=ChildDisp(buf);
  1263.     ScanDataX=xx;
  1264.     ScanDataY=yy;
  1265.     DataX=x_;
  1266.     FullColor=0;
  1267.     DataC=0;
  1268.     //- 輝度ビット寝かす
  1269.     N=ScanData;
  1270.     for(i=x_*yy;i>0;i--)
  1271.         *N++&=0xFFFE;
  1272.     return(r);
  1273. }
  1274. if ( *RGBtemp==0 ){
  1275.     if ( _dos_getenv("jxtemp",0,tn)>=0 ){
  1276.         ;
  1277.     } elif ( _dos_getenv("temp",0,tn)>=0 ){
  1278.         ;
  1279.     } else {
  1280.         struct    _psp *pd = _dos_getpdb();
  1281.         jstrcpy(tn,(char *)pd->exe_path);
  1282.     }
  1283. } else    jstrcpy(tn,RGBtemp);
  1284. jstrcat(tn,"$J25????.RGB");
  1285. fi=_dos_maketmp(tn,bit(5));
  1286. if ( fi<0 )
  1287.     return(fi);
  1288. _dos_close(fi);
  1289. sprintf(buf,"dj -r %s %s",Afile,tn);
  1290. r=ChildDisp(buf);
  1291. if ( DrvAccess(0,tn)!=0 ){
  1292.     return("ドライブが用意でいていません");
  1293. }
  1294. r=_dos_open(tn,0);
  1295. if ( r>=0 ){
  1296.     fi=r;
  1297.     r=RGBLoad(fi,tn);
  1298.     if ( r==0 ){
  1299.         _dos_close(fi);
  1300.     }
  1301. }
  1302. _dos_delete(tn);
  1303. strmfe(buf,tn,"FAL");
  1304. _dos_delete(buf);
  1305. return(r);
  1306. }
  1307. /*********************************
  1308.     GLM ロード
  1309. *********************************/
  1310. int    GLMLoad(f)
  1311. int    f;
  1312. {
  1313. int    i,x,xx,y,yy,x_;
  1314. UNshort    w;
  1315. UNchar    *M;
  1316. UNshort    buf[16000/2];
  1317. __fread(f,buf,12);        // dummy 読み込み
  1318. if ( strncmp(buf,"GR65",4)!=0 ){
  1319.     return("GLM ファイル じゃないようです");
  1320. }
  1321. __fread(f,&w,2);
  1322. ScanDataX=w;
  1323. __fread(f,&w,2);
  1324. ScanDataY=w;
  1325.  
  1326. x_=(ScanDataX+7)&0xFFF8;
  1327. if ( x_<512 )
  1328.     x_=512;
  1329. if ( mat_vadds==0 ){
  1330.     if ( FullColor==0 )
  1331.         M=_dos_malloc(x_*ScanDataY*2);
  1332.     elif ( ImageMode==0 )            // 0;カラー 1;白黒
  1333.         M=_dos_malloc(x_*ScanDataY*3);
  1334.     else    M=_dos_malloc(x_*ScanDataY);
  1335.     if ( M>=0x81000000 ){
  1336.         return("メモリが足りませんでした");
  1337.     }
  1338. } else {
  1339.     if ( xx>mat_xwidth || yy>mat_ywidth ){
  1340.         return("仮想画面SIZE OVER です。");
  1341.     }
  1342.     M=mat_vadds;
  1343.     x_ = mat_xwidth;
  1344.     FullColor=0;
  1345. }
  1346. ScanData=M;
  1347. for(y=0;y<ScanDataY;y++){
  1348.     if ( FullColor==0 ){
  1349.         // 64k
  1350.         yy=(y)*x_*2;
  1351.         __fread(f,&ScanData[yy],ScanDataX*2);
  1352.     } else {
  1353.         // 24bit
  1354.         __fread(f,buf,ScanDataX*2);
  1355.         if ( ImageMode==0 ){
  1356.             // カラー
  1357.             yy=y*x_*3;
  1358.             for(x=0;x<ScanDataX;x++){
  1359.                 i=buf[x];
  1360.                 ScanData[yy+x*3+0]=RR(i)*8;
  1361.                 ScanData[yy+x*3+1]=GG(i)*8;
  1362.                 ScanData[yy+x*3+2]=BB(i)*8;
  1363.             }
  1364.         } else {
  1365.             // モノクロ
  1366.             yy=(y)*x_;
  1367.             for(x=0;x<ScanDataX;x++){
  1368.                 i=buf[x];
  1369.                 ScanData[yy+x]=GG(i)*8;
  1370.             }
  1371.         }
  1372.     }
  1373. }
  1374. if ( FullColor!=0 ){
  1375.     if ( ImageMode==0 )
  1376.         DataMd=5;
  1377.     else    DataMd=2;
  1378.     DataC=FullColor;
  1379. }
  1380. DataX=x_;
  1381. return(0);
  1382. }
  1383. /*************************************
  1384.     チャイルドサブ
  1385. **************************************/
  1386. int    ChildDisp(bu)
  1387. char    *bu;
  1388. {
  1389. int    o,r;
  1390. o=_iocs_b_wpeek(0xE82600);
  1391. _iocs_b_wpoke(0xE82600,0x193F);
  1392. cls();
  1393. printf("\n\n\n%s\n",bu);
  1394. _iocs_tpalet(3,RGB(31,31,31));
  1395. r=CHILD(bu);
  1396. if ( r!=0 ){
  1397.     printf("\n [何かキーを押して下さい]\n");
  1398.     _dos_kflushio(0xFF);
  1399.     _dos_inkey();
  1400.     _dos_kflushio(0xFF);
  1401.     RecodeModeDraw();
  1402.     Rec_PosSetDraw(RecX1,RecY1,RecX2,RecY2);
  1403. }
  1404. _iocs_b_wpoke(0xE82600,o);
  1405. _dos_c_curoff();
  1406. TXCLS(0);
  1407. SetMsPat();
  1408. MsPat(-1);
  1409. return(r);
  1410. }
  1411.